Concept

This strategy depends on previously loading all data, aligned with the mixed hg19 and mm10 genomes, into Seurat and clustering. One cluster is identified as human, and the barcodes from this cluster have already been stored as “hm.rds.” The remaining mouse cells were stored as “musCells.rds.”

To begin this analysis, load all raw data from cellranger again, marking each sample by prepending “s1..s4” to the barcode.

A homologene conversion table is also saved (as “geneTrans.txt”) but is missing the mitochondrial genes. The human and mouse mitochondrial genes are extracted from the rownames of the Seurat object and appended to the homologene table, becoming the object “xTrans.”

The Seurat object is output to a table of raw counts. The human subset is obtained by selecting the data with the array of human barcodes. The homologenes are selected also, and then the table is converted to mouse gene symbols. The raw counts table is then selected for mouse barcodes and mouse gene symbols present in the homologene table.

These two tables are each loaded into a Seurat object and then merged, normalized and scaled. Show clusters labeled by cell; split by sample. Show nCount_RNA also. Determine significantly-different list mouse vs human.

Load Data

Read cellranger output from each sample. Clean up gene symbols (replace “_" with “-”). Add sample IDs to barcodes. Finally, create Seurat objects from each sample, merge them, and delete intermediate objects.

s1.data=Read10X(data.dir="../results/S1/outs/filtered_feature_bc_matrix/")
s2.data=Read10X(data.dir="../results/S2/outs/filtered_feature_bc_matrix/")
s3.data=Read10X(data.dir="../results/S3/outs/filtered_feature_bc_matrix/")
s4.data=Read10X(data.dir="../results/S4/outs/filtered_feature_bc_matrix/")

#some human gene symbols have underscores (but these are not in geneTrans).
#Substitute a dash so as not to raise an error.
#Note that v3 of CreateSeuratObject also translates underscore to dashes, so
#feature names become "hg19-" and "mm10-" unlike previous (v2) datasets.
rownames(s1.data)=gsub("_","-",rownames(s1.data))
rownames(s2.data)=gsub("_","-",rownames(s2.data))
rownames(s3.data)=gsub("_","-",rownames(s3.data))
rownames(s4.data)=gsub("_","-",rownames(s4.data))

#rename cells
colnames(x=s1.data) <- paste('s1',colnames(x=s1.data),sep="_")
colnames(x=s2.data) <- paste('s2',colnames(x=s2.data),sep="_")
colnames(x=s3.data) <- paste('s3',colnames(x=s3.data),sep="_")
colnames(x=s4.data) <- paste('s4',colnames(x=s4.data),sep="_")

#create objects
s1=CreateSeuratObject(counts=s1.data,project="MG")
s2=CreateSeuratObject(counts=s2.data,project="MG")
s3=CreateSeuratObject(counts=s3.data,project="MG")
s4=CreateSeuratObject(counts=s4.data,project="MG")

#Use https://satijalab.org/seurat/essential_commands.html 
mg=merge(x=s1,y=c(s2,s3,s4),project="MG")

#at this point we don't need all the original sample objects--can re-create if needed
rm(s1,s2,s3,s4,s1.data,s2.data,s3.data,s4.data)

#summary of object
print(mg)
## An object of class Seurat 
## 112137 features across 29974 samples within 1 assay 
## Active assay: RNA (112137 features)

Prepare homologene translation table

Import conversion table (geneTrans) to translate human symbols to mouse symbols. Add mitochondrial genes.

#load gene translation table
geneTrans=read.table("geneTrans.txt",sep=",",header=T,stringsAsFactors = F,row.names = 1)

#need to fix underscore->dash conversion for geneTrans, from v2 Seurat analysis
geneTrans$hg19=gsub("_","-",geneTrans$hg19)
geneTrans$mm10=gsub("_","-",geneTrans$mm10)
row.names(geneTrans)=gsub("_","-",row.names(geneTrans))

#extract mito genes for both species and add to geneTrans
mito.m=grep("^mm10-mt",rownames(mg),value=T)
mito.h=grep("^hg19-MT-",rownames(mg),value=T)
mito.m=substr(mito.m,6,nchar(mito.m))
mito.h=substr(mito.h,6,nchar(mito.h))
#turns out, these two vectors (n=37 each) are ordered and match, build an extended translation table
mitoTrans=data.frame(row.names = paste("mm10",mito.m,sep="-"),
                     Human.Symbol = mito.h,
                     Homologene_ID = rep(NA,length(mito.m)),
                     None = rep("yes",length(mito.m)),
                     Mouse.Symbol = mito.m,
                     hg19 = paste("hg19",mito.h,sep="-"),
                     mm10 = paste("mm10",mito.m,sep="-")
                     )

#extended translation table
xTrans = rbind(geneTrans,mitoTrans)
dim(xTrans)
## [1] 17666     6
head(xTrans)
##              Human.Symbol Homologene_ID None Mouse.Symbol         hg19
## mm10-A1bg            A1BG         11167  yes         A1bg    hg19-A1BG
## mm10-A1cf            A1CF         16363  yes         A1cf    hg19-A1CF
## mm10-A2m              A2M         37248  yes          A2m     hg19-A2M
## mm10-A3galt2      A3GALT2         16326  yes      A3galt2 hg19-A3GALT2
## mm10-A4galt        A4GALT          9690  yes       A4galt  hg19-A4GALT
## mm10-A4gnt          A4GNT         87446  yes        A4gnt   hg19-A4GNT
##                      mm10
## mm10-A1bg       mm10-A1bg
## mm10-A1cf       mm10-A1cf
## mm10-A2m         mm10-A2m
## mm10-A3galt2 mm10-A3galt2
## mm10-A4galt   mm10-A4galt
## mm10-A4gnt     mm10-A4gnt

Translate human gene symbols to mouse

Import arrays of human and mouse barcodes.

Results were previously split by barcode IDs in a previous clustering (see Xu et al., 2019)

The original clustering, using this dataset and the mixed genome, produced one cluster that was clearly the human cells. The barcode IDs were stored in a RDS file. Re-load here to simplify gene translation. Similarly, the remaining mouse barcodes were stored in musCells.

hmCells=readRDS("hm.rds")
musCells=readRDS("musCells.rds")
length(hmCells)
## [1] 1684
length(musCells)
## [1] 17459

Extract and convert human cell matrix

From the combined Seurat object, extract a copy of the raw counts and then subset it for human genes and barcodes. Translate the human gene symbols to mouse gene symbols. Then convert back to a Seurat object.

#extract all raw counts into table for subsetting by human cells and genes
hg.raw=GetAssayData(mg,slot="counts")

#subset rows in geneTrans (not necessary but simpler)
hg.raw=hg.raw[row.names(hg.raw) %in% xTrans$hg19,]  #cut from 13283 to 11364 rows
hg.raw=hg.raw[,colnames(hg.raw) %in% hmCells]

#translate human symbols to mouse
hg.trans=merge(x=hg.raw,y=xTrans[,c(5,6)],by.x=0,by.y="hg19",all.x=T)
rownames(hg.trans)=hg.trans$mm10
hg.trans=hg.trans[,!(names(hg.trans) %in% c("Row.names","mm10"))]

#remove "mm10"" from gene symbol
row.names(hg.trans)=substr(row.names(hg.trans),6,nchar(row.names(hg.trans)))

#convert matrix back into Seurat object
hm=CreateSeuratObject(hg.trans,project="MG",min.cells=5)
rm(hg.raw,hg.trans)
print(hm)
## An object of class Seurat 
## 9689 features across 1684 samples within 1 assay 
## Active assay: RNA (9689 features)

Extract mouse cell matrix

Extract a copy of the raw counts, subset for mouse genes and barcodes, and convert back to Seurat object.

mm.raw=GetAssayData(mg,slot="counts")
mm.raw=mm.raw[row.names(mm.raw) %in% xTrans$mm10,]
mm.raw=mm.raw[,colnames(mm.raw) %in% musCells]
row.names(mm.raw)=substr(row.names(mm.raw),6,nchar(row.names(mm.raw)))

mm=CreateSeuratObject(mm.raw,project="MG",min.cells=5)
rm(mm.raw)
print(mm)
## An object of class Seurat 
## 14828 features across 17459 samples within 1 assay 
## Active assay: RNA (14828 features)

Merge mouse and human Seurat objects

Now that we have two Seurat objects, one derived from human cells with translated mouse gene symbols, and the other from the mouse cells only, merge back into a single object.

#merge with mouse
hm=merge(x=hm,y=mm,project="HM")

#clean up objects no longer needed
rm(mm,mito.m,mito.h)

#summarize merged object
print(hm)
## An object of class Seurat 
## 15022 features across 19143 samples within 1 assay 
## Active assay: RNA (15022 features)

Scale and normalize

Use standard workflow to calculate percent.mito (now all mouse symbols) and visualize by sample.

#filter and normalize merged object
mito.features=grep(pattern="^mt-",x=rownames(x=hm),value=T)
percent.mito=Matrix::colSums(x=GetAssayData(object=hm,slot="counts")[mito.features,]) / 
  Matrix::colSums(x=GetAssayData(object=hm,slot='counts'))
hm[['percent.mito']] = percent.mito
plot(density(percent.mito),main="Percent Mito Density Plot")

Diagnostic plots.

To assess quality of the samples, plots showing the numbers of features per cell, the numbers of RNA detected per cell, and the percent mito are shown as jittered dots with a violin distribution summary. A scatterplot compares the number of RNAs identified per cell with the percent mito (colored by sample). Finally, a second scatterplot compares the number of features identified with the number of RNAs counted per cell (colored by sample).

VlnPlot(object=hm,features=c("nFeature_RNA","nCount_RNA","percent.mito"),ncol=3)

FeatureScatter(object=hm,feature1 = "nCount_RNA",feature2 = "percent.mito")

FeatureScatter(object=hm,feature1 = "nCount_RNA",feature2 = "nFeature_RNA")

Filter for Minimal Expression and Scale

Print summary data before and after subsetting. Then normalize, find variable genes, and scale.

print(hm)
## An object of class Seurat 
## 15022 features across 19143 samples within 1 assay 
## Active assay: RNA (15022 features)
hm=subset(hm,nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mito < 0.05) 
print(hm)
## An object of class Seurat 
## 15022 features across 17879 samples within 1 assay 
## Active assay: RNA (15022 features)
hm=NormalizeData(hm,normalization.method = "LogNormalize",scale.factor=1e4)
hm=FindVariableFeatures(hm,selection.method = 'mean.var.plot',
                        mean.cutoff = c(0.0125,3),dispersion.cutoff = c(0.5,Inf)) 
length(VariableFeatures(hm))
## [1] 2016
hm=ScaleData(hm,vars.to.regress = c("nCount_RNA","percent.mito"))
## Regressing out nCount_RNA, percent.mito
## Scaling data matrix

Dimension reduction

PCA

Start with PCA and determine how many dimensions are informative. Output diagnostics.

hm=RunPCA(hm,features=VariableFeatures(hm),verbose=F)
print(hm[['pca']],dims=1:5,nfeatures=5,projected=F)
## PC_ 1 
## Positive:  Gria2, Dclk1, Meg3, Aplp1, Meis2 
## Negative:  Tyrobp, C1qb, C1qc, C1qa, Aif1 
## PC_ 2 
## Positive:  Gria2, Dclk1, Meis2, C1qb, C1qc 
## Negative:  Flt1, Cldn5, Itm2a, Igfbp7, Ptprb 
## PC_ 3 
## Positive:  Syt1, Meg3, Ndrg4, Snap25, Gad1 
## Negative:  Car2, Cnp, Cryab, Cldn11, Ermn 
## PC_ 4 
## Positive:  Cldn11, Ermn, Mal, Stmn4, Tubb4a 
## Negative:  Atp1a2, Gja1, Slc1a3, Plpp3, Aldoc 
## PC_ 5 
## Positive:  mt-Nd3, mt-Co2, Spp1, Cd74, H2-Ea-ps 
## Negative:  Hexb, Ctss, Ctsd, Fyb, Rnase4
VizDimLoadings(hm,dims=1:2)

DimPlot(hm)

hm=ProjectDim(hm,verbose=F)
DimHeatmap(hm,dims=1,cells=500,balanced=T)

DimHeatmap(hm,dims=1:6,cells=500,balanced=T)

hm=JackStraw(hm,num.replicate=100)
hm=ScoreJackStraw(hm,dims=1:20)
JackStrawPlot(hm,dims=1:20)
## Warning: Removed 28220 rows containing missing values (geom_point).

ElbowPlot(hm)

Clustering

Use first 13 dimensions of PCA, cluster data and report the number of cells per cluster.

#start clustering
hm=FindNeighbors(hm,dims=1:13) 
## Computing nearest neighbor graph
## Computing SNN
hm=FindClusters(hm,resolution=0.2)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 17879
## Number of edges: 614589
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9716
## Number of communities: 14
## Elapsed time: 6 seconds
table(Idents(hm))
## 
##    0    1    2    3    4    5    6    7    8    9   10   11   12   13 
## 4603 2507 2404 1988 1911 1274  789  665  533  373  359  321   94   58

tSNE

Calculate tSNE projection and add to object. Plot tSNE for entire object or split by original sample.
Plot diagnostic Spp1 (specific for human microglia) and Hexb (specific for mouse microglia). Plot number of RNAs detected per cell.

hm=RunTSNE(hm,dims=1:13)
DimPlot(hm,reduction='tsne')

DimPlot(hm,reduction='tsne',split.by='orig.ident')

FeaturePlot(hm,features='Spp1')

FeaturePlot(hm,features='Hexb')

FeaturePlot(hm,features='nCount_RNA')

UMAP

Add UMAP projection to object. Plot along with diagnostic genes and numbers of RNAs.

hm=RunUMAP(hm,dims = 1:13)
DimPlot(hm,reduction='umap')

FeaturePlot(hm,features='Spp1')

FeaturePlot(hm,features='Hexb')

FeaturePlot(hm,features='nCount_RNA')

Label clusters

Calculate the features (genes) that distinguish each cluster from the mixture of remaining clusters. Display the top ten genes for each cluster, sorted by the average log fold change.

hm.markers=FindAllMarkers(hm,only.pos=T,min.pct = .25,logfc.threshold = .25,verbose=F)
hm.markers %>% group_by(cluster) %>% top_n(10,avg_logFC)
## # A tibble: 140 x 7
## # Groups:   cluster [14]
##    p_val avg_logFC pct.1 pct.2 p_val_adj cluster gene   
##    <dbl>     <dbl> <dbl> <dbl>     <dbl> <fct>   <chr>  
##  1     0      2.51 0.981 0.291         0 0       Slc1a2 
##  2     0      2.34 0.948 0.194         0 0       Aldoc  
##  3     0      2.29 0.862 0.085         0 0       Ntsr2  
##  4     0      2.29 0.942 0.16          0 0       Plpp3  
##  5     0      2.19 0.94  0.144         0 0       Gja1   
##  6     0      2.19 0.972 0.314         0 0       Mt2    
##  7     0      2.16 0.901 0.163         0 0       Clu    
##  8     0      2.15 0.971 0.287         0 0       Slc1a3 
##  9     0      2.15 0.559 0.047         0 0       Slc6a11
## 10     0      2.08 0.988 0.395         0 0       Mt3    
## # … with 130 more rows

Save a csv file with the top 5 genes per list. The csv file is saved with a “.txt” extension to prevent Excel from automatically converting gene names to dates. For example “March5” is normally converted to 3/5/2019. Manually important the file into Excel allows the user to specify that the column containing gene symbols should be treated as text.

hm.markers %>% group_by(cluster) %>% top_n(5,avg_logFC) %>% 
  write.csv("DHT Top 5 per cluster.csv.txt",row.names = F)

Identify human and mouse microglial clusters

Use Spp1 and Hexb to identify cluster number(s) for human and mouse microglia, respectively.

humClus=as.character(subset(hm.markers,gene=="Spp1")$cluster)
print(humClus)
## [1] "5"
musClus=as.character(subset(hm.markers,gene=="Hexb")$cluster)
print(musClus)
## [1] "2"  "12" "13"

Find genes differentially expressed between human and mouse microglia

With the identifiers stored, we can now find significantly different expression of genes distinguishing mouse and human microglia.

diffGenes=FindMarkers(hm,ident.1=humClus,ident.2=musClus,min.pct=0.1)
nrow(diffGenes)
## [1] 1711

Display summary of differentially expressed genes

The table shows the numbers of genes with adjusted p-value <= 0.05, at least 2-fold different, or both. The filtered list is displayed.

table(sig=diffGenes$p_val_adj <= 0.05, twofold=abs(diffGenes$avg_logFC) >= 1)
##        twofold
## sig     FALSE TRUE
##   FALSE    14    0
##   TRUE   1451  246
diffGenes %>% tibble::rownames_to_column() %>% 
  filter(p_val_adj <= 0.05) %>% 
  filter(abs(avg_logFC) >= 1) %>% paged_table

Output Results

Save differential expressed list as object (for later use in R) and csv (as text to preserve gene names)

saveRDS(diffGenes,"DHT_diffGenes.rds")
write.table(as.data.frame(diffGenes),"DHT_diffGenes.csv.txt",sep=",",quote=T)

Cluster Averages

To evaluate expression levels of individual genes, extract the average expression level (linear normalized counts) for each cluster. Show sample of file and output as CSV (with “.txt” suffix as before).

hm.mean=AverageExpression(hm,add.ident="orig.ident",verbose=F)
head(hm.mean$RNA)
##             5_s1       1_s1        2_s1        4_s1       0_s1       8_s1
## A1bg  0.00000000 0.00000000 0.000000000 0.000000000 0.00000000 0.00000000
## A2m   6.51426128 0.01803440 0.007313983 0.000000000 0.42660682 0.00000000
## Aaas  0.09805454 0.07467464 0.051768906 0.023832681 0.03697663 0.12515645
## Aacs  0.06989817 0.04681504 0.078273992 0.005851649 0.19419455 0.00000000
## Aagab 0.06720742 0.13755333 0.314611214 0.169491842 0.10260681 0.04069739
## Aak1  2.08870073 0.32509616 0.304912579 1.349488018 0.59841337 0.48605735
##             7_s1       3_s1       9_s1       6_s1     11_s1      10_s1
## A1bg  0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.00000000
## A2m   0.06211489 0.07758004 0.07676129 0.04814382 1.2632902 2.33251246
## Aaas  0.05383290 0.12206591 0.17096233 0.00000000 0.1718981 0.08642295
## Aacs  0.33383597 0.00000000 0.00000000 0.03989866 0.2024824 0.06605369
## Aagab 0.36315077 0.13207846 0.01608519 0.18883233 0.3957454 0.04191080
## Aak1  0.51916569 0.64416169 0.36113035 0.53296140 0.4582857 0.76320502
##           12_s1     13_s1       5_s2       3_s2       1_s2       0_s2
## A1bg  0.0000000 0.0000000 0.02163378 0.00000000 0.00000000 0.00000000
## A2m   0.8635841 0.0000000 5.97837703 0.03116459 0.01000964 0.12149467
## Aaas  0.1823753 0.3484199 0.13992722 0.04735050 0.02766605 0.01054639
## Aacs  0.0000000 0.0000000 0.00000000 0.04079518 0.04505710 0.31314036
## Aagab 1.1416743 0.0000000 0.17040765 0.14417725 0.05858973 0.15457138
## Aak1  0.7317904 0.2715989 1.50949019 0.30096744 0.32193754 0.66518330
##            10_s2       2_s2       4_s2      11_s2    12_s2      8_s2
## A1bg  0.00000000 0.00000000 0.00000000 0.00000000 0.000000 0.0000000
## A2m   0.34463914 0.00000000 0.00000000 0.49406486 0.000000 0.0000000
## Aaas  0.04059348 0.02950091 0.13182740 0.03697144 0.000000 0.0000000
## Aacs  0.05534800 0.04934028 0.05304860 0.08021531 0.000000 0.0000000
## Aagab 0.20216885 0.37791831 0.07929372 0.19370490 0.000000 0.1092037
## Aak1  0.53601544 0.48080282 1.03910428 0.42636740 1.199808 1.1008134
##             9_s2       6_s2       7_s2    13_s2       5_s3       1_s3
## A1bg  0.00000000 0.00000000 0.00000000 0.000000 0.07615166 0.00000000
## A2m   0.05800935 0.04046945 0.09483167 0.000000 5.67226561 0.01172709
## Aaas  0.00000000 0.02759991 0.00000000 0.000000 0.11162848 0.05823968
## Aacs  0.09717512 0.11834782 0.14751432 0.000000 0.05642304 0.05288668
## Aagab 0.00000000 0.24243516 0.12957564 0.000000 0.09777691 0.10099257
## Aak1  0.30036250 0.72203213 0.97973982 1.908397 2.39475899 0.43061784
##             0_s3       4_s3        2_s3       7_s3       3_s3      11_s3
## A1bg  0.00000000 0.00000000 0.000000000 0.00000000 0.00000000 0.00000000
## A2m   0.19376557 0.01362000 0.006439532 0.03665474 0.00000000 0.36162411
## Aaas  0.05273833 0.01129654 0.035015445 0.01373868 0.09217814 0.04021151
## Aacs  0.23830876 0.00000000 0.023005582 0.03779411 0.03137384 0.11428998
## Aagab 0.13753030 0.13500441 0.224546398 0.12870306 0.15469933 0.18325088
## Aak1  0.66379411 1.43589172 0.360315416 0.77572166 0.55009392 0.41752666
##             6_s3      10_s3       8_s3      12_s3      9_s3     13_s3
## A1bg  0.00000000 0.00000000 0.00000000 0.00000000 0.0000000 0.0000000
## A2m   0.00000000 0.01728334 0.00000000 0.00000000 0.0000000 0.0000000
## Aaas  0.03990819 0.09547679 0.03241470 0.00000000 0.2702148 0.0000000
## Aacs  0.03739630 0.04524805 0.02089864 0.00000000 0.0000000 0.0000000
## Aagab 0.03592139 0.09088335 0.04486153 0.08167266 0.0698812 0.4319468
## Aak1  0.60737775 0.50182729 0.48039519 0.21331058 0.6734346 0.7632842
##             5_s4        3_s4       0_s4       6_s4       4_s4       1_s4
## A1bg  0.00000000 0.000000000 0.00000000 0.00000000 0.00000000 0.00000000
## A2m   6.11876769 0.004732796 0.12069356 0.00000000 0.02715190 0.01837634
## Aaas  0.14393409 0.016092732 0.05459799 0.08079821 0.05552747 0.04612040
## Aacs  0.08641502 0.010894291 0.16207560 0.03679718 0.07677476 0.06828998
## Aagab 0.07093040 0.172470004 0.09107345 0.06901813 0.11100047 0.10258943
## Aak1  2.96514866 0.365436101 0.58973692 1.16480105 1.44766149 0.42343873
##             2_s4       9_s4     10_s4       8_s4       7_s4     12_s4
## A1bg  0.00000000 0.00000000 0.0000000 0.00000000 0.00000000 0.0000000
## A2m   0.00000000 0.09061911 0.4625947 0.00000000 0.01141041 0.0000000
## Aaas  0.10970929 0.03309330 0.0270475 0.06935919 0.07742343 0.0000000
## Aacs  0.03220165 0.00000000 0.0000000 0.06577606 0.13932987 0.0000000
## Aagab 0.27510570 0.13021772 0.0340748 0.06881465 0.08822602 0.0000000
## Aak1  0.39787465 0.57502942 0.5733602 0.38475438 0.67057328 0.7252027
##           13_s4     11_s4
## A1bg  0.0000000 0.0000000
## A2m   0.0000000 0.2533557
## Aaas  0.0000000 0.0000000
## Aacs  0.0000000 0.2407130
## Aagab 0.3140154 0.4172203
## Aak1  0.5854643 0.7164377
write.csv(hm.mean$RNA,"DHT hm cluster averages.csv.txt")

Split tSNE by Species

To display the cluster data coded by species, use the original barcode arrays to re-label the cells. The old (cluster ID) identifiers are stored as “old.idents”.

#stash idents 
hm[["old.ident"]]=Idents(hm)
#apply new idents from stored vectors
Idents(hm,cells=hmCells)="Human"
Idents(hm,cells=musCells)="Mouse"
table(hm$orig.ident,Idents(hm))
##     
##      Mouse Human
##   s1  3641   294
##   s2  2685   214
##   s3  4560   465
##   s4  5719   301

Plot tsne labeled by species no legend

DimPlot(hm,label=T,repel=T,label.size=8,reduction = "tsne")+NoLegend()

Plot nCounts in tsne labeled by species

FeaturePlot(hm,features='nCount_RNA',reduction = "tsne")

FeaturePlot(hm,features='nCount_RNA',reduction = "tsne",split.by="ident")

Session Info

sessionInfo()
## R version 3.5.3 (2019-03-11)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.2 LTS
## 
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3
## LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] rmarkdown_1.12    dplyr_0.8.0.1     Seurat_3.0.0.9000
## 
## loaded via a namespace (and not attached):
##  [1] nlme_3.1-137        tsne_0.1-3          bitops_1.0-6       
##  [4] RColorBrewer_1.1-2  httr_1.4.0          tools_3.5.3        
##  [7] utf8_1.1.4          R6_2.4.0            irlba_2.3.3        
## [10] KernSmooth_2.23-15  lazyeval_0.2.2      colorspace_1.4-1   
## [13] npsurv_0.4-0        withr_2.1.2         tidyselect_0.2.5   
## [16] compiler_3.5.3      cli_1.1.0           plotly_4.9.0       
## [19] labeling_0.3        caTools_1.17.1.2    scales_1.0.0       
## [22] lmtest_0.9-36       ggridges_0.5.1      pbapply_1.4-0      
## [25] stringr_1.4.0       digest_0.6.18       R.utils_2.8.0      
## [28] pkgconfig_2.0.2     htmltools_0.3.6     bibtex_0.4.2       
## [31] htmlwidgets_1.3     rlang_0.3.4         zoo_1.8-5          
## [34] jsonlite_1.6        ica_1.0-2           gtools_3.8.1       
## [37] R.oo_1.22.0         magrittr_1.5        Matrix_1.2-17      
## [40] Rcpp_1.0.1          munsell_0.5.0       fansi_0.4.0        
## [43] ape_5.3             reticulate_1.12     R.methodsS3_1.7.1  
## [46] stringi_1.4.3       yaml_2.2.0          gbRd_0.4-11        
## [49] MASS_7.3-51.1       gplots_3.0.1.1      Rtsne_0.15         
## [52] plyr_1.8.4          grid_3.5.3          parallel_3.5.3     
## [55] gdata_2.18.0        listenv_0.7.0       ggrepel_0.8.0      
## [58] crayon_1.3.4        lattice_0.20-38     cowplot_0.9.4      
## [61] splines_3.5.3       SDMTools_1.1-221    knitr_1.22         
## [64] pillar_1.3.1        igraph_1.2.4        future.apply_1.2.0 
## [67] codetools_0.2-16    glue_1.3.1          evaluate_0.13      
## [70] lsei_1.2-0          metap_1.1           data.table_1.12.2  
## [73] png_0.1-7           Rdpack_0.11-0       gtable_0.3.0       
## [76] RANN_2.6.1          purrr_0.3.2         tidyr_0.8.3        
## [79] future_1.12.0       assertthat_0.2.1    ggplot2_3.1.1      
## [82] xfun_0.6            rsvd_1.0.0          survival_2.43-3    
## [85] viridisLite_0.3.0   tibble_2.1.1        cluster_2.0.8      
## [88] globals_0.12.4      fitdistrplus_1.0-14 ROCR_1.0-7